﻿using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

//继承MovingObject类
public class Player : MovingObject {

	public int wallDamage = 1; //对墙壁的伤害
	public int pointsPerFood = 10; //食物的回复量
	public int pointsPerSoda = 20; //苏打水的回复量
	public float restartlevelDelay = 1f; //进入下一关的时间差

	private Animator animator; //PlayerChop, PlayerHit用
	private int food; //Player体力

	
	public Text foodText; //FoodText


	//********** 修改开始 **********//
	//触摸点的初始坐标 Vector2(-1.0, -1.0)
	private Vector2 touchOrigin = -Vector2.one;
	//********* 修改结束 **********//	

	//继承MovingObject的Start方法　用base调用
	protected override void Start () {
		//获取Animator
		animator = GetComponent<Animator> ();
		//从单例的GameManager中获取playerFoodPoints
		//即使跨越场景（关卡）也能保持变量
		food = GameManager.instance.playerFoodPoints;

		
		foodText.text = "Food: " + food;
		

		//调用MovingObject的Start
		base.Start ();
	}

	//Player脚本无效之前、体力保存至GameManager
	//Unity的生命周期API方法
	private void OnDisable () {
		GameManager.instance.playerFoodPoints = food;
	}

	void Update () {
		//Player回合之外Update的处理直接跳出
		if (!GameManager.instance.playersTurn) {
			return;
		}

		int horizontal = 0; //-1: 左移动, 1: 右移动
		int vertical = 0; //-1: 下移动, 1: 上移动


		//********** 修改开始 **********//

#if DEV
		// Debug.Log("测试环境");
#elif PROD
		// Debug.Log("正式环境");
#endif

		//用于判断平台
		//键盘操作
#if UNITY_STANDALONE || UNITY_WEBPLAYER

		horizontal = (int)Input.GetAxisRaw ("Horizontal");
		vertical = (int)Input.GetAxisRaw ("Vertical");

		if (horizontal != 0) {
			vertical = 0;
		}

		//触摸操作
#else
		//触摸的位置超过0处，也就是发生了触摸
		if (Input.touchCount > 0) {
			//touches数组中、选择使用最初的那组
			Touch myTouch = Input.touches[0];
			//如果开始触摸
			if (myTouch.phase == TouchPhase.Began) {
				//使touchOrigin获取触摸的坐标
				touchOrigin = myTouch.position;
			}
			//如果手指从画面中离开（从点击到离开 完成一次输入），并且横方向大于0(防止重复判定)
			else if (myTouch.phase == TouchPhase.Ended && touchOrigin.x >= 0) {
				//获取手指离开时的位置
				Vector2 touchEnd = myTouch.position;
				//计算从touchEnd.x到touchOrigin.x延伸出来横方向的移动长度
				float x = touchEnd.x - touchOrigin.x;
				//计算从touchEnd.y到touchOrigin.y延伸出来纵方向的移动长度
				float y = touchEnd.y - touchOrigin.y;
				//防止再次进入if文 强制修改touchOrigin.x
				touchOrigin.x = -1;
				//横轴的移动长度大于纵轴的移动长度时，设定成horizontal(横)
				if (Mathf.Abs(x) > Mathf.Abs(y))
					//x笔0大的时候判定为(右移动)、小的话判定为-1(左移动)
					horizontal = x > 0 ? 1 : -1;
				//纵轴的移动长度大于横轴的移动长度时，设定成vertical(纵)
				else
					//y比0大的时候判定为1(上移动)、小的时候判定为-1(下移动)
					vertical = y > 0? 1 : -1;
			}
		}
		//平台判定结束
#endif

		//********* 修改结束 **********//

		//无论进行上下左右移动之时
		if (horizontal != 0 || vertical != 0) {
			//Wall: 指定传入范型<T>类
			//Player的场合只需要判定Wall
			AttemptMove<Wall> (horizontal, vertical);
		}
	}

	protected override void AttemptMove<T> (int xDir, int yDir) {
		//移动1回减少1个食物
		food--;

		
		foodText.text = "Food: " + food;
		

		//调用MovingObject的AttemptMove
		base.AttemptMove<T> (xDir, yDir);

		RaycastHit2D hit;

		CheckIfGameOver ();
		//Player回合结束 (改轮到敌人行动了)
		GameManager.instance.playersTurn = false;
	}

	//必须复写MovingObject的抽象方法
	protected override void OnCantMove<T> (T component) {

		//作业5的提示 思路一判断一下T是什么游戏对象
		// if (component.gameObject.tag == "NPC") {
			//如果是NPC 那么我们在这里写一个食物更换弹药的逻辑
		// }

		// 思路二.还一种方法就是让NPC继承这个Wall类
		// 把这个墙被攻击的方法（DamageWall）给复写掉


		//用Wall型用来反射获取 Wall脚本
		Wall hitWall = component as Wall;
		//调用Wall脚本的DamageWall方法
		hitWall.DamageWall (wallDamage);
		//触发对Wall攻击的动画
		animator.SetTrigger ("PlayerChop");

		
	}

	private void OnTriggerEnter2D (Collider2D other) {
		if (other.tag == "Exit") {
			//Invoke: 根据参数延迟执行方法
			//我要执行这个名为Restart的方法 并且在1秒后执行
			Invoke ("Restart", restartlevelDelay);

			//(禁止操作/防止骚操作、跳关、敲打墙壁发出音效等等)
			this.enabled = false; //使Player脚本无效

		} else if (other.tag == "Food") {
			//体力回复删除other对象
			food += pointsPerFood;

			// 使得我们吃到的食物对象消失 
			// 类同Destroy(other);  Destroy设计到内存的回收 所以的异步的 比较吃性能
			other.gameObject.SetActive (false); // SetActive相对来说比较省性能
		} else if (other.tag == "Soda") {
			//体力回复删除other对象
			food += pointsPerSoda;
			other.gameObject.SetActive (false);
		}


		// 作业3提示
		// 比如在这里碰到的是敌人发射出的子弹
		// 减少food并且销毁子弹
		
		foodText.text = "Food: " + food;

		
		
		// 如果这里有一个有毒的食品 那么应该是加一个负数并且要检查是否GameOver
	}

	private void Restart () {
		// 读取相同的场景
		// Application.LoadLevel(Application.loadedLevel); // 过时


		// 作业5和6的提示 判断一下当前的关卡（level） if (level%5 == 0) 的时候去别的关卡
		// SceneManager.LoadScene ("某关卡名");
		
		// 读取当前关卡 （Unity2017之后）
		SceneManager.LoadScene (SceneManager.GetActiveScene ().name);


	}

	//敌方角色对Player攻击时执行的方法
	public void LoseFood (int loss) {
		animator.SetTrigger ("PlayerHit");
		// food -= loss;
		// CheckIfGameOver();


		AddFood (-loss);

		
		
		foodText.text = "Food: " + food;
		
	}

	private void AddFood (int add) {
		food += add;
		CheckIfGameOver ();
	}

	private void CheckIfGameOver () {
		if (food <= 0) {
			//执行GameManager的GameOver方法
			GameManager.instance.GameOver ();
		}
	}

	// 作业4的提示
	void useItem() {

		if (Input.GetKeyDown(KeyCode.F)) {
			// 这里干点事情 比如生成某个碰撞体
		}

	}
}